/*----------------------------------------------------------------------------------------
*
*  Copyright 2019, Gao Hai Hui, <fromzeropoint@126.com>.  All rights reserved.
*  https://gitee.com/helloworldghh/xoskit.git
*  Use of this source code is governed by a MIT license
*  that can be found in the License file.
*
----------------------------------------------------------------------------------------*/
#ifndef __C556347C_2D2B_467b_9FB5_DC1032E2B5E6__
#define __C556347C_2D2B_467b_9FB5_DC1032E2B5E6__

namespace xos_container
{
    class i_container;
}

namespace xos_encrypt
{

    /////////////////////////////////////////////////////////////////////////////////
    // 
    // ssl接口
    // 
    class i_ssl : public xos::i_release
    {
    protected:
        virtual ~i_ssl(){}

    public:
        // 
        // decode说明：
        //  1 : 初始状态，是接收对方shakehand包的。此时生成的返回握手包在pSendBack中，需立刻发给对方
        //  2 : 正常状态，解密，生成数据在pOut中。
        //  3 : 正常状态，收到对方的close_notify，此时生成返回确认包，在pSendBack中，需立刻发给对方
        // 
        //  0 : 解密成功
        // -1 : 解密失败，协议或数据错误
        //  2 : 连接成功
        // -2 : 连接失败，协议或数据错误。服务端接受连接时才会发生，可以利用它来切换到非ssl的明文协议状态
        //  3 : 连接断开
        // -4 : 写入BIO失败，不太可能
        virtual int decode( xos_box::i_list * pIn, xos_box::i_list * pOut, xos_box::i_list * pSendBack ) = 0;

        // 
        // encode说明：
        // 
        //  1 : 初始状态，且pIn为空，表示想建立连接，pOut中为生成的shakehand包
        //  2 : 正常连接，且pIn非空，当然是加密数据，pOut中为加密后的数据
        //  3 : 正常连接，且pIn为空，表示要断开连接，pOut中为生成的shutdown包
        // 
        // 生成的数据包都直接发送给对方
        // 
        //  0 : 成功，可能是：生成shakehand包成功，加密数据成功，生成shutdown包成功。
        // -1 : 失败，不可能出现失败，这个方法永远成功
        // 
        virtual int encode( xos_box::i_list * pIn, xos_box::i_list * pOut ) = 0;

        // 初始化
        virtual int init_ssl() = 0;
    };

    // 
    // ssl管理接口
    // 
    class i_ssl_mgr : public xos::i_release
    {
    protected:
        virtual ~i_ssl_mgr(){}

    public:
        // ssl方法
        virtual int set_server_domain( const char * lpszDomain ) = 0;
        virtual int set_cert( const char * lpszFile ) = 0;
        virtual int set_key( const char * lpszFile ) = 0;
        virtual int init_ssl( bool bServer ) = 0;

        // 创建
        virtual i_ssl * ssl() = 0;
    };

    /////////////////////////////////////////////////////////////////////////////////
    // 
    // rsa接口
    // 
    class i_rsa : public xos::i_release
    {
    protected:
        virtual ~i_rsa(){}

    public:
        // other : 返回长度
        //    -1 : 失败
        virtual int encode( char * lpszOutBuf, const char * lpszInBuf, int nInLen ) = 0;
        virtual int decode( char * lpszOutBuf, const char * lpszInBuf, int nInLen ) = 0;

        // encode with buf
        virtual int encode( xos_box::i_buf * pOutBuf, xos_box::i_buf * pInBuf ) = 0;
        virtual int decode( xos_box::i_buf * pOutBuf, xos_box::i_buf * pInBuf ) = 0;

        // encode with list
        virtual int encode( xos_box::i_list * pOutList, xos_box::i_list * pInList ) = 0;
        virtual int decode( xos_box::i_list * pOutList, xos_box::i_list * pInList ) = 0;

        // 公钥还是私钥端
        virtual int set_type( bool bPrivate ) = 0;
    };

    // 
    // rsa管理接口
    // 
    class i_rsa_mgr : public xos::i_release
    {
    protected:
        virtual ~i_rsa_mgr(){}

    public:
        // rsa方法
        virtual int set_rsa_private_key( const char * lpszFile ) = 0;
        virtual int set_rsa_public_key( const char * lpszFile ) = 0;
        virtual int init_rsa() = 0;

        // 创建
        virtual i_rsa * rsa() = 0;
    };

    /////////////////////////////////////////////////////////////////////////////////
    // 
    // 3des接口
    // 
    class i_des : public xos::i_release
    {
    protected:
        virtual ~i_des(){}

    public:
        // other : 返回长度
        //    -1 : 失败
        virtual int encode( char * lpszOutBuf, const char * lpszInBuf, int nInLen ) = 0;
        virtual int decode( char * lpszOutBuf, const char * lpszInBuf, int nInLen ) = 0;

        // encode with buf
        virtual int encode( xos_box::i_buf * pOutBuf, xos_box::i_buf * pInBuf ) = 0;
        virtual int decode( xos_box::i_buf * pOutBuf, xos_box::i_buf * pInBuf ) = 0;

        // encode with list
        virtual int encode( xos_box::i_list * pOutList, xos_box::i_list * pInList ) = 0;
        virtual int decode( xos_box::i_list * pOutList, xos_box::i_list * pInList ) = 0;

        // 3des方法
        virtual int set_3des_key( const char * lpszKey, int nKeyLen ) = 0;

    };

    /////////////////////////////////////////////////////////////////////////////////
    // 
    // i_encrypt_mgr
    // 
    class i_encrypt_mgr : public xos::i_release
    {
    protected:
        virtual ~i_encrypt_mgr(){}

    public:
        // 创建对象
        virtual int set_ssl_ctx_prop( xos_box::i_str_property * pProp ) = 0;
        virtual i_ssl_mgr * ssl() = 0;
        virtual i_rsa_mgr * rsa() = 0;
        virtual i_des * des() = 0;
    };

    /////////////////////////////////////////////////////////////////////////////////
    // 
    // export function
    // 
    typedef int ( * f_create )( xos_container::i_container * pContainer, i_encrypt_mgr ** ppv );


} // xos_encrypt

#endif // __C556347C_2D2B_467b_9FB5_DC1032E2B5E6__
